package com.xinqi.modules.prepare.prepare.enums;

import cn.hutool.core.util.StrUtil;
import com.xinqi.common.base.annotations.Describe;
import lombok.Getter;

import java.util.Objects;
import java.util.Optional;

/**
 * 备课区操作日志
 *
 * @author linkai
 * @date 2023/03/19
 */
@Describe("备课区操作日志")
public enum PrepareOperateLogEnum {

    /**
     * 文件添加，示例：
     * <p>添加了 资料：好看的图片22</p>
     * <p>添加了 作业：文件</p>
     */
    FILE_ADD(PrepareOperateTypeEnum.FILE_EDIT, PrepareSubOperateTypeEnum.ADD, "{}：{}"),
    /**
     * 文件编辑，示例：
     * <p>编辑了 资料：好看的图片22</p>
     */
    FILE_EDIT(PrepareOperateTypeEnum.FILE_EDIT, PrepareSubOperateTypeEnum.EDIT, "{}：{}"),
    /**
     * 文件删除（能还原，默认30天），示例：
     * <p>删除了 资料：好看的图片22</p>
     */
    FILE_DEL(PrepareOperateTypeEnum.FILE_DEL, PrepareSubOperateTypeEnum.DEL, "{}：{}"),
    /**
     * 成员添加（能还原，默认30天），示例：
     * <p>添加了 刘老师邀请“林凯”加入语文组备课区</p>
     */
    MEMBER_ADD(PrepareOperateTypeEnum.MEMBER_CHANGE, PrepareSubOperateTypeEnum.ADD, "{}邀请“{}”加入{}"),
    /**
     * 成员变更，示例：
     * <p>变更了 将“林凯”由【成员】更改为【管理员】</p>
     */
    MEMBER_CHANGE(PrepareOperateTypeEnum.MEMBER_CHANGE, PrepareSubOperateTypeEnum.CHANGE, "将“{}”由【{}】更改为【{}】"),
    /**
     * 成员移除，示例：
     * <p>移除了 将“林凯”从语文组备课区移除</p>
     */
    MEMBER_REMOVE(PrepareOperateTypeEnum.MEMBER_CHANGE, PrepareSubOperateTypeEnum.REMOVE, "将“{}”从{}移除"),
    /**
     * 成员退出，示例：
     * <p>移除了 将“林凯”从语文组备课区移除</p>
     */
    MEMBER_QUIT(PrepareOperateTypeEnum.MEMBER_CHANGE, PrepareSubOperateTypeEnum.QUIT, "成员“{}”从{}退出"),
    /**
     * 试题添加，示例：
     * <p>添加了 试题：特别难的题</p>
     */
    QUESTION_ADD(PrepareOperateTypeEnum.QUESTION_EDIT, PrepareSubOperateTypeEnum.ADD, "试题：{}"),
    /**
     * 试题编辑，示例：
     * <p>编辑了 试题：特别难的题</p>
     */
    QUESTION_EDIT(PrepareOperateTypeEnum.QUESTION_EDIT, PrepareSubOperateTypeEnum.EDIT, "试题：{}"),
    /**
     * 试题删除，示例：
     * <p>删除了 试题：特别难的题</p>
     */
    QUESTION_DEL(PrepareOperateTypeEnum.QUESTION_DEL, PrepareSubOperateTypeEnum.DEL, "试题：{}"),
    /**
     * 试题夹添加，示例：
     * <p>添加了 试题夹：特别难的题</p>
     */
    QUESTION_FOLDER_ADD(PrepareOperateTypeEnum.QUESTION_EDIT, PrepareSubOperateTypeEnum.ADD, "试题夹：{}"),
    /**
     * 试题夹编辑，示例：
     * <p>编辑了 试题夹：特别难的题</p>
     */
    QUESTION_FOLDER_EDIT(PrepareOperateTypeEnum.QUESTION_EDIT, PrepareSubOperateTypeEnum.EDIT, "试题夹：{}"),
    /**
     * 试题夹删除，示例：
     * <p>删除了 试题夹：特别难的题</p>
     */
    QUESTION_FOLDER_DEL(PrepareOperateTypeEnum.QUESTION_DEL, PrepareSubOperateTypeEnum.DEL, "试题夹：{}"),
    ;

    @Getter
    private final PrepareOperateTypeEnum type;

    @Getter
    private final PrepareSubOperateTypeEnum subType;

    private final String msg;

    PrepareOperateLogEnum(PrepareOperateTypeEnum type, PrepareSubOperateTypeEnum subType, String msg) {
        this.type = type;
        this.subType = subType;
        this.msg = msg;
    }

    public static Optional<PrepareOperateLogEnum> of(PrepareOperateTypeEnum type, PrepareSubOperateTypeEnum subType) {
        for (PrepareOperateLogEnum logEnum : PrepareOperateLogEnum.values()) {
            if (Objects.equals(logEnum.getType(), type) && Objects.equals(logEnum.getSubType(), subType)) {
                return Optional.of(logEnum);
            }
        }
        return Optional.empty();
    }

    /**
     * 格式化消息
     */
    public static String format(PrepareOperateTypeEnum type, PrepareSubOperateTypeEnum subType, Object... args) {
        return of(type, subType).map(v -> v.format(args)).orElse(null);
    }

    /**
     * 格式化消息
     */
    public String format(Object... args) {
        return StrUtil.format(this.msg, args);
    }
}
